package clases.academico;

import CapaDatos.DataSource;
import CapaDatos.Sql;
import clases.incio.Paginacion;
import global.Dialogos;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;

public class Periodo {

    private int idperiodo;
    private String periodo;
    private boolean estado;
    private String fechainicio;
    private String fechafinal;
    private String sql;
    private DataSource dt;
    public Paginacion objPaginacion;

    public String getPeriodo() {
        return periodo;
    }

    public int getIdperiodo() {
        return idperiodo;
    }

    public void setIdperiodo(int idperiodo) {
        this.idperiodo = idperiodo;
    }

    public void setPeriodo(String periodo) {
        this.periodo = periodo;
    }

    public boolean isEstado() {
        return estado;
    }

    public void setEstado(boolean estado) {
        this.estado = estado;
    }

    public Periodo() {
        dt = new DataSource();
        objPaginacion = new Paginacion();
    }

    public String getFechainicio() {
        return fechainicio;
    }

    public void setFechainicio(String fechainicio) {
        this.fechainicio = fechainicio;
    }

    public String getFechafinal() {
        return fechafinal;
    }

    public void setFechafinal(String fechafinal) {
        this.fechafinal = fechafinal;
    }

    public void sacarIdPeriodo(String periodo) {
        sql = "SELECT IDPERIODO FROM PERIODO WHERE PERIODO='" + periodo + "'";
        Sql.getConsulta(sql, dt);
        while (dt.next()) {
            this.setIdperiodo(dt.getInt(1));
        }
    }

    private boolean cambiarestado() {
        sql = "UPDATE PERIODO SET ESTADO=FALSE WHERE ESTADO=TRUE";
        if (Sql.actualizar(sql) == true) {
            return true;
        } else {
            Dialogos.Error("Error al cambiar el estado del periodo");
            return false;
        }
    }

    public boolean guardarPeriodoLectivo() {
        if (this.ExistenciaPeriodo() == true) {
            global.Mensajes.mostrarMensaje("Advertencia!", "El periodo ya existe", 2);
            return false;
        } else if (this.cambiarestado() == true && Sql.insertar("INSERT INTO PERIODO VALUES ("
                + "" + Sql.getMax("IDPERIODO", "PERIODO", true) + ", '" + this.fechainicio + "', "
                + "'" + this.fechafinal + "', '" + this.periodo + "', " + true + ")") == true) {
            Dialogos.GuardadoconExito();
            this.limpiarPeriodo();
            return true;
        } else {
            Dialogos.Error("Error al ingresar el periodo");
            return false;
        }
    }

    public boolean actualizarPeriodoLectivo() {
        sql = "UPDATE PERIODO SET FECHAINICIO='" + this.fechainicio + "', "
                + "FECHAFIN='" + this.fechafinal + "', "
                + "PERIODO='" + this.periodo + "' "
                + "WHERE IDPERIODO='" + this.getIdperiodo() + "'";
        if (Sql.actualizar(sql) == true) {
            global.Mensajes.mostrarMensaje("Correcto!", "Datos actualizados correctamente", 1);
            this.limpiarPeriodo();
            return true;
        } else {
            Dialogos.Error("Error al actualizar el periodo");
            return false;
        }
    }

    public boolean EliminarPeriodoLectivo(String periodo) {
        if (Sql.isExiste("SELECT * FROM PERIODO "
                + "WHERE IDPERIODO IN (SELECT IDPERIODO "
                + "FROM PERIODOCURSO) AND PERIODO='" + periodo + "'") == true) {
            Dialogos.Error("El periodo tiene cursos asignados... No se puede eliminar");
            return false;
        } else if (global.Mensajes.mostrarPregunta("¿Realmente desea eliminar el periodo?") == true) {
            return Sql.eliminar("DELETE FROM PERIODO WHERE IDPERIODO "
                    + "NOT IN (SELECT IDPERIODO FROM PERIODOCURSO) "
                    + "AND PERIODO='" + periodo + "'");
        } else {
            Dialogos.Error("Error al eliminar el periodo");
            return false;
        }
    }

    public boolean ExistenciaPeriodo() {
        sql = "SELECT * FROM PERIODO WHERE PERIODO='" + periodo + "'";
        return Sql.isExiste(sql);
    }

    public boolean ExistenciaPeriodo(String periodo) {
        sql = "SELECT * FROM PERIODO WHERE PERIODO='" + periodo + "' AND PERIODO!='" + this.periodo + "'";
        return Sql.isExiste(sql);
    }

    public boolean cambiarPeriodo(String periodo) {
        sql = "SELECT IDPERIODO, PERIODO FROM PERIODO WHERE PERIODO='" + periodo + "'";
        Sql.getConsulta(sql, dt);
        while (dt.next()) {
            this.setIdperiodo(dt.getInt(1));
            this.periodo = dt.getString(2);
        }
        if (this.cambiarestado() == true) {
            sql = "UPDATE PERIODO SET ESTADO=TRUE WHERE IDPERIODO=" + this.getIdperiodo() + "";
            if (Sql.actualizar(sql) == true) {
                global.Mensajes.mostrarMensaje("Correcto!", "" + this.periodo + " activado correctamente...", 1);
                return true;
            } else {
                Dialogos.Error("Error al cambiar de periodo");
                return false;

            }
        } else {
            return false;
        }
    }

    public String SqlGeneralPeriodo() {
        sql = "SELECT PERIODO, TO_CHAR(FECHAINICIO, 'DD/MM/yyyy'), "
                + "TO_CHAR(FECHAFIN, 'DD/MM/yyyy'), ESTADO FROM PERIODO "
                + "ORDER BY (IDPERIODO) DESC";
        return sql;
    }

    public String SqlBuscar(String buscar) {
        sql = "SELECT PERIODO, TO_CHAR(FECHAINICIO, 'DD/MM/yyyy'), "
                + "TO_CHAR(FECHAFIN, 'DD/MM/yyyy'), ESTADO FROM PERIODO "
                + " WHERE LTRIM(PERIODO,'PERIODO LECTIVO ') = '" + buscar + "' "
                + "ORDER BY (IDPERIODO) DESC";
        return sql;
    }

    public void ConsultaPeriodo(DefaultTableModel modelo, JTable tabla, String sql, JLabel Lpaginatotal, JLabel Lpagina, int pagina) {
        modelo = new DefaultTableModel() {
            @Override
            public boolean isCellEditable(int fila, int columna) {
                return false;
            }
        };
        tabla.setModel(modelo);
        modelo.addColumn("Nº");
        modelo.addColumn("PERIODO");
        modelo.addColumn("INICIO MATRICULACIÓN");
        modelo.addColumn("FIN MATRICULACIÓN");
        modelo.addColumn("ESTADO");
        DefaultTableCellRenderer centrar = new DefaultTableCellRenderer();
        centrar.setHorizontalAlignment(SwingConstants.CENTER);
        tabla.getColumnModel().getColumn(0).setCellRenderer(centrar);
        TableColumn columna = new TableColumn();
        columna = tabla.getColumnModel().getColumn(0);
        columna.setPreferredWidth(10);
        columna = tabla.getColumnModel().getColumn(1);
        columna.setPreferredWidth(300);
        columna = tabla.getColumnModel().getColumn(2);
        columna.setPreferredWidth(300);
        columna = tabla.getColumnModel().getColumn(3);
        columna.setPreferredWidth(300);
        sql = objPaginacion.getPaginacion(sql, pagina, 50);
        Sql.getConsulta(sql, dt);

        String[] fila;
        int n = (pagina * 50) - 49;
        while (dt.next()) {
            fila = new String[5];
            fila[0] = Integer.toString(n);
            fila[1] = dt.getString(1);
            fila[2] = dt.getString(2);
            fila[3] = dt.getString(3);
            fila[4] = CambiarBoolean(dt.getString(4));

            modelo.addRow(fila);
            n++;
        }
        objPaginacion.actualPagina(Lpagina);
        objPaginacion.totalPaginas(Lpaginatotal);
        tabla.getSelectionModel().setSelectionInterval(0, 0);
    }

    public void ConsultaBuscar(DefaultTableModel modelo, JTable tabla, String sql, JLabel Lpaginatotal, JLabel Lpagina, int pagina) {
        modelo = new DefaultTableModel() {
            @Override
            public boolean isCellEditable(int fila, int columna) {
                return false;
            }
        };
        tabla.setModel(modelo);
        modelo.addColumn("Nº");
        modelo.addColumn("PERIODO");
        modelo.addColumn("ESTADO");
        DefaultTableCellRenderer centrar = new DefaultTableCellRenderer();
        centrar.setHorizontalAlignment(SwingConstants.CENTER);
        tabla.getColumnModel().getColumn(0).setCellRenderer(centrar);
        TableColumn columna = new TableColumn();
        columna = tabla.getColumnModel().getColumn(0);
        columna.setPreferredWidth(10);
        columna = tabla.getColumnModel().getColumn(1);
        columna.setPreferredWidth(300);
        columna = tabla.getColumnModel().getColumn(2);
        columna.setPreferredWidth(40);

        sql = objPaginacion.getPaginacion(sql, pagina, 25);
        Sql.getConsulta(sql, dt);

        String[] fila;
        int n = (pagina * 25) - 24;
        while (dt.next()) {
            fila = new String[3];
            fila[0] = Integer.toString(n);
            fila[1] = dt.getString(1);
            fila[2] = CambiarBoolean(dt.getString(2));

            modelo.addRow(fila);
            n++;
        }
        objPaginacion.actualPagina(Lpagina);
        objPaginacion.totalPaginas(Lpaginatotal);
        tabla.getSelectionModel().setSelectionInterval(0, 0);
    }

    public void llenardatosPeriodo(String periodo) {
        sql = "SELECT PERIODO.IDPERIODO, PERIODO, "
                + "TO_CHAR(FECHAINICIO, 'DD/MM/yyyy'), "
                + "TO_CHAR(FECHAFIN, 'DD/MM/yyyy') "
                + "FROM PERIODO "
                + "WHERE PERIODO='" + periodo + "'";
        Sql.getConsulta(sql, dt);
        while (dt.next()) {
            this.setIdperiodo(dt.getInt(1));
            this.periodo = dt.getString(2);
            this.setFechainicio(dt.getString(3));
            this.setFechafinal(dt.getString(4));
        }
    }

    public boolean PeriodoActivo() {
        sql = "SELECT * FROM PERIODO WHERE ESTADO=TRUE";
        Sql.getConsulta(sql, dt);
        return Sql.getTotalRegistros(dt) != 0;
    }

    public String CambiarBoolean(String dato) {
        if (dato.equals("t")) {
            return "ACTIVO";
        } else {
            return "INACTIVO";
        }
    }

    public void listarPeriodoCombo(JComboBox cbo) {
        cbo.removeAllItems();
        cbo.addItem("--Seleccione--");
        Sql.getConsulta("SELECT PERIODO FROM PERIODO ORDER BY(IDPERIODO) DESC", dt);
        while (dt.next()) {
            cbo.addItem(dt.getString(1));
        }
        cbo.setSelectedIndex(0);
    }

    public void listarPeriodo(JComboBox cbo) {
        cbo.removeAllItems();
        cbo.addItem("--Seleccione--");
        Sql.getConsulta("SELECT LTRIM(PERIODO,'PERIODO LECTIVO ') FROM PERIODO ORDER BY(IDPERIODO) DESC", dt);
        while (dt.next()) {
            cbo.addItem(dt.getString(1));
        }
        cbo.setSelectedIndex(0);
    }

    private void limpiarPeriodo() {
        this.periodo = "";
        this.idperiodo = 0;
        this.fechafinal = "";
        this.fechainicio = "";
    }

}
